package localhost.mb;

import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import localhost.ejb.DaoOrcamento;
import localhost.ejb.Somavel;
import localhost.model.Conta;
import localhost.model.Extrato;
import localhost.model.Movimento;
import localhost.model.Parcelado;
import localhost.view.MessageBean;
import localhost.view.PageTransitionBean;
import localhost.view.ViewResumo;

@ManagedBean(name = "mbResumo")
@SessionScoped
public class MbResumo {

	@EJB
	DaoOrcamento daoOrca;

	private ViewResumo tela = new ViewResumo();
	PageTransitionBean pt = new PageTransitionBean();
	MessageBean mb = new MessageBean();
	MetodosComuns mc = new MetodosComuns();
	FacesContext fc = FacesContext.getCurrentInstance();

	Date dataAtual = new Date();
	NumberFormat formatoMoeda = NumberFormat.getCurrencyInstance();
	List<Double> listaEntradas = new ArrayList<Double>();
	List<Double> listaSaidas = new ArrayList<Double>();
	List<Parcelado> parcelaEntradas = new ArrayList<Parcelado>();
	List<Parcelado> parcelaSaidas = new ArrayList<Parcelado>();
	
	public String montaTelaInicial(){
		System.out.println("#### Metodo montaTelaInicial #####");
		limpaTela();
		populaSelectContas();
		return pt.chamaResumo();
	}

	public void limpaTela() {
		this.tela.setConta(new Conta());
		this.tela.setExtrato(new Extrato());
		this.tela.setIdContaSelecionado(0);
		this.tela.getEntradas().clear();
		this.tela.getSaidas().clear();
		this.tela.getParcelaEntradas().clear();
		this.tela.getParcelaSaidas().clear();
	}
	
	public String montaTelaInicialDetalhe(){
		limpaTela();
		populaSelectContas();
		return pt.chamaDetalhe();
	}
	
	public void geraExtrato(ValueChangeEvent e) {
		System.out.println("#### Metodo geraExtrato #####");
		int id = Integer.valueOf(e.getNewValue().toString());
		Conta conta = daoOrca.retornaConta(id);
		Extrato extrato = criaExtrato(conta);
		verificaSaldo(extrato);
		this.tela.setVisibilidadeForm(true);
		this.tela.setExtrato(extrato);
	}
	
	public void verificaSaldo(Extrato extrato){
		double saldo = extrato.getSaldo();
		boolean neg = saldo<0?true:false;
		this.tela.setNegativo(neg);
	}

	public Extrato criaExtrato(Conta conta) {
		System.out.println("#### Metodo criaExtrato #####");

		this.tela.getEntradas().clear();
		this.tela.getSaidas().clear();
		this.tela.getParcelaEntradas().clear();
		this.tela.getParcelaSaidas().clear();
		this.listaEntradas.clear();
		this.listaSaidas.clear();
		this.parcelaEntradas.clear();
		this.parcelaSaidas.clear();

		List<Movimento> entradas = daoOrca.listaEntradasConta(conta);
		List<Movimento> saidas = daoOrca.listaSaidasConta(conta);
		List<Parcelado> entradasPar = daoOrca
				.listaParceladosEntradasConta(conta);
		List<Parcelado> saidasPar = daoOrca.listaParceladosSaidasConta(conta);
		
		this.tela.setEntradas(entradas);
		this.tela.setSaidas(saidas);
		this.tela.setParcelaEntradas(entradasPar);
		this.tela.setParcelaSaidas(saidasPar);
		
		System.out.println("entradas : "+entradas.size());
		System.out.println("saidas : "+saidas.size());
		System.out.println("entradasPar : "+entradasPar.size());
		System.out.println("saidasPar : "+saidasPar.size());

		Double somaEntradas = entradas.size()>0?retornaSomaLista(entradas):0;
		Double somaSaidas = saidas.size()>0?retornaSomaLista(saidas):0;
		Double somaEntradasPar = entradasPar.size()>0?retornaSomaValorParcelemento(entradasPar):0;
		Double somaSaidasPar = saidasPar.size()>0?retornaSomaValorParcelemento(saidasPar):0;

		Double saldo = somaEntradas - somaSaidas;
		Double saldoP = somaEntradasPar - somaSaidasPar;
		Double saldoFinal = saldo+saldoP;
		Extrato extrato = new Extrato(conta, somaEntradas, somaSaidas,
				somaEntradasPar, somaSaidasPar, saldoFinal);
		return extrato;

	}

	public Double retornaSomaLista(List<? extends Somavel> lista) {
		Double saldo = new Double(0);

		for (Somavel s : lista) {
			saldo = saldo + s.getValor();
		}
		return saldo;
	}
	
/*	public Double retornaSomaLista(List<? extends Somavel> lista, String tipo) {
		Double saldo = new Double(0);

		for (Somavel s : lista) {
			saldo = saldo + s.getValor();
		}
		switch (tipo) {
		case "E":
			listaEntradas.add(saldo);
			break;
		case "S":
			listaSaidas.add(saldo);
			break;
		}
		return saldo;
	}*/

	public Double retornaSomaValorParcelemento(List<Parcelado> parcelas) {
		double vr = 0;
		Date datafim = new Date();
		for (Parcelado p : parcelas) {
			datafim = dtafim(p.getDtaini(), p.getQtd());
			if(datafim.after(dataAtual)){
				vr+=p.getValor();
				System.out.println(p.getDescricao()+" Inicio: "+
				new SimpleDateFormat("dd/MM/yyyy").format(p.getDtaini())+" Fim:"+
						new SimpleDateFormat("dd/MM/yyyy").format(datafim)+" Valor:"+vr);
				
			}
			p.setDtafim(datafim);
			if(p.getTipo().equals("E")){
				parcelaEntradas.add(p);
			}else{
				parcelaSaidas.add(p);
			}
		}
		this.tela.setParcelaEntradas(parcelaEntradas);
		this.tela.setParcelaSaidas(parcelaSaidas);
		return vr;

	}

	public Date dtafim(Date dataini, int qtd) {

		Calendar c = Calendar.getInstance();
		c.setTime(dataini);
		c.set(Calendar.MONTH, c.get(Calendar.MONTH) + (qtd + 1));
		System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(c
				.getTime()));
		return c.getTime();

	}
	
	public void populaSelectContas() {
		List<Conta> contas = daoOrca.listaContas();
		List<SelectItem> selectI = new ArrayList<SelectItem>();
		for (Conta conta : contas) {
			selectI.add(new SelectItem(conta.getId(), conta.getDescricao()));
		}

		this.tela.setSelectContas(selectI);
	}

	public ViewResumo getTela() {
		return tela;
	}

	public void setTela(ViewResumo tela) {
		this.tela = tela;
	}

	// ############################ MENSAGENS #############################
	public void msgRetornoGeral(String idComp, String msg) {
		mb.addMessageSemBundle(msg, idComp, FacesMessage.SEVERITY_WARN);
	}

}